package com.zf.websocket.endpoint;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 获取各种参数
 */
@Slf4j
@Component
@ServerEndpoint("/param/{userId}/{username}")
public class ParamEndpoint {

    /**
     * 连接建立成功后调用的方法，@OnOpen 注解的方法会在建立连接成功的时候调用，名称可以自定义，@OnError、@OnMessage、@OnClose 同理
     * <p>
     * 每次建立连接都会产生一个新的 HelloWebSocketServer 对象，之后在该连接对应的 HelloWebSocketServer 对象 中执行其 open、close、error、message 方法。
     * 每次建立连接后都会产生一个 session 对象
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("username") String username) throws IOException {
        log.info("[客户端] {} 连接成功", session.getId());

        // 通过@PathParam注解方式获取路径参数
        System.out.println(username);
        // 获取全部路径参数
        Map<String, String> pathParameters = session.getPathParameters();
        System.out.println(pathParameters);
        // 获取全部参数：路径参数和查询参数。如果路径参数和查询参数重名则默认保留路径参数，不保留重名的查询参数
        Map<String, List<String>> requestParameterMap = session.getRequestParameterMap();
        System.out.println(requestParameterMap);

        // 获取查询参数字符串
        System.out.println(session.getRequestURI().getQuery());
        System.out.println(session.getQueryString());
        // 获取域名之后的请求路径字符串
        System.out.println(session.getRequestURI().getPath());

    }

    /**
     * 连接关闭调用的方法，此时已经断开了连接
     */
    @OnClose
    public void onClose(Session session) {
        log.info("[客户端] {} 断开连接", session.getId());

    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        log.info("[客户端] {} :{}", session.getId(), message);
    }


    /**
     * 发生错误时执行的方法
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("用户错误:" + ",原因:" + error.getMessage());
        error.printStackTrace();
    }

}
